BillboardLineRendererCircle.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using UnityEngine;
  2. public class BillboardLineRendererCircle : MonoBehaviour {
  3. public Color color = Color.black;
  4. public float width = 1f;
  5. public int numSegments = 50;
  6. public float radius = 0.5f;
  7. private LineRenderer _lineRenderer;
  8. void Start() {
  9. _lineRenderer = gameObject.GetComponent<LineRenderer>();
  10. if (_lineRenderer != null) return;
  11. // Initialize line renderer.
  12. _lineRenderer = gameObject.AddComponent<LineRenderer>();
  13. _lineRenderer.materials = new[] {
  14. new Material(Shader.Find("Universal Render Pipeline/Unlit")) { color = color }
  15. };
  16. _lineRenderer.startWidth = width * 0.01f;
  17. _lineRenderer.endWidth = width * 0.01f;
  18. _lineRenderer.positionCount = numSegments + 1;
  19. _lineRenderer.useWorldSpace = false;
  20. // Create points.
  21. float deltaTheta = (float)(2.0 * Mathf.PI) / numSegments;
  22. float theta = 0f;
  23. for (int i = 0; i < numSegments + 1; i++) {
  24. float x = Mathf.Cos(theta);
  25. float y = Mathf.Sin(theta);
  26. Vector3 pos = new Vector3(x, y, 0);
  27. _lineRenderer.SetPosition(i, pos * radius);
  28. theta += deltaTheta;
  29. }
  30. }
  31. [ContextMenu("Reinitialize")]
  32. private void Reinitialize() {
  33. if (_lineRenderer != null) {
  34. DestroyImmediate(_lineRenderer);
  35. }
  36. Start();
  37. Update();
  38. }
  39. private void Update() {
  40. transform.LookAt(Camera.main.transform);
  41. transform.Rotate(0, 180, 0);
  42. }
  43. }